草庐IT

javascript oop、instanceof 和基类

全部标签

c++ - 是否可以通过引用以基类为参数的函数来传递派生类

假设我们有一个带有纯虚方法(接口(interface))的抽象基类IBase。然后我们从基类派生出CFoo、CFoo2。我们有一个知道如何使用IBase的函数。Foo(IBase*input);这些情况下通常的情况是这样的:IBase*ptr=static_cast(newCFoo("abc"));Foo(ptr);deleteptr;但是指针管理最好避免,那么有没有办法在这种情况下使用引用?CFooinst("abc");Foo(inst);Foo在哪里:Foo(IBase&input); 最佳答案 是的。您不必向上转换您的对象。

c++ - 仅使用基类指针复制派生实体,(无需详尽的测试!) - C++

给定一个由大量派生类继承的基类,以及一个要求您通过指向每个实体的基类指针来管理这些的程序结构。在只知道基类指针的情况下,有没有一种简单的方法可以复制整个派生对象?环顾四周,使用dynamic_cast调用检查是否可以将基指针转换为适当的派生类,然后使用派生类的复制构造函数复制它似乎是可能的(如果非常乏味的话).然而,这并不是一个真正的最佳解决方案,部分原因是过度使用了dynamic_cast,而且维护和扩展也会让人头疼。我遇到的另一个更优雅的解决方案如下:classBase{public:Base(constBase&other);virtualBase*getCopy();...}c

c++ - 成员初始值设定项未命名非静态数据成员或基类

这个问题在这里已经有了答案:Initializeparent'sprotectedmemberswithinitializationlist(C++)(5个回答)关闭9年前。我很难在谷歌上找到这方面的点击率。structa{floatm_x;floatm_z;public:a(floatx):m_x(x){}};classb:publica{b(floatz):m_z(z){}};在铿锵3.2上:error:memberinitializer'm_z'doesnotnameanon-staticdatamemberorbaseclassb(floatz):m_z(z){}

c++ - 为什么隐式复制构造函数调用基类复制构造函数而定义的复制构造函数不调用?

考虑一个类层次结构,其中A是基类,B派生自A。如果B中没有定义拷贝构造函数,编译器会合成一个。当被调用时,这个复制构造函数将调用基类复制构造函数(即使是合成的,如果用户没有提供的话)。#includeclassA{inta;public:A(){std::cout输出:CreatingBA::DefaultconstructorB::DefaultconstructorCreatingBbycopyA::Copyconstructor如果用户在B中定义了自己的拷贝构造函数,当被调用时,这个拷贝构造函数会调用基类默认构造函数,除非调用了基类拷贝构造函数显式存在(例如在初始化列表中)。#i

c++ - 在模板派生类中,为什么我需要在成员函数内使用 "this->"限定基类成员名称?

当我调查Qt的源代码时,我看到trolltech人员明确使用this关键字来访问析构函数上的字段。inline~QScopedPointer(){T*oldD=this->d;Cleanup::cleanup(oldD);this->d=0;}那么,这种用法有什么意义呢?有什么好处吗?编辑:对于那些投票结束这个问题的人,我怀疑这种用法是用于某些类继承的情况QScopedPointerclass的一部分定义:template>classQScopedPointer 最佳答案 C++答案(一般答案)考虑一个模板类Derived使用模板基

c++ - union 作为基类

该标准定义了union不能用作基类,但是对此有什么具体的理由吗?据我所知,union可以有构造函数、析构函数、成员变量和操作这些变量的方法。简而言之,union可以封装可以通过成员函数访问的数据类型和状态。因此,在最常见的术语中,它有资格成为一个类,如果它可以充当一个类,那么为什么它不能充当基类呢?编辑:虽然答案试图解释推理,但我仍然不明白Union作为派生类比作为一个类的Union更糟糕。因此,为了获得更具体的答案和推理,我将插入这个悬赏。对已经发布的答案没有冒犯,谢谢! 最佳答案 托尼·帕克给出了一个非常接近事实的答案。C++委

c++ - 删除是否适用于指向基类的指针?

您是否必须传递delete与new返回的相同指针,或者您可以传递一个指向类基类型之一的指针?例如:classBase{public:virtual~Base();...};classIFoo{public:virtual~IFoo(){}virtualvoidDoSomething()=0;};classBar:publicBase,publicIFoo{public:virtual~Bar();voidDoSomething();...};Bar*pBar=newBar;IFoo*pFoo=pBar;deletepFoo;当然,这大大简化了。我真正想做的是创建一个充满boost::s

特定基类的 C++ 类模板

假设我有类(class):classBase{};classA:publicBase{inti;};classB:publicBase{boolb;};现在我想定义一个模板类:templateclassBasePair{T1first;T2second;};但我想将其定义为只有Base类的后代可以用作模板参数。我该怎么做? 最佳答案 C++11引入templateclassBasePair{static_assert(std::is_base_of::value,"T1mustderivefromBase");static_asse

c++ - 使用 C++ 基类构造函数?

在使用模板时,我遇到了需要使基类构造函数可以从继承的类中访问以创建对象以减少复制/粘贴操作。我正在考虑通过using关键字以与函数大小写相同的方式执行此操作,但这不起作用。classA{public:A(intval){}};classB:publicA{};classC:publicA{public:C(conststring&val){}};classD:publicA{public:D(conststring&val){}usingA::A;//g++error:A::Anamesconstructor};voidmain(){Bb(10);//Ok.(A::Aconstruct

c++ - 如果与基类相比没有新的成员变量,C++ 是否允许增加派生类的大小?

假设我有一个包含一些成员变量但没有虚函数的基类:classBase{intmember;};以及从Base以非虚拟方式派生的派生类,并且没有新的成员变量,也没有虚拟函数:classDerived:Base{};显然sizeof(Derived)不能小于sizeof(Base)。sizeof(Derived)是否必须等于sizeof(Base)? 最佳答案 从5.3.2[expr.sizeof]Whenappliedtoaclass,theresult[ofsizeof]isthenumberofbytesinanobjectofth